Down Jones Avg
el dja es una serie diaria, todas las demás son anuales.
dja <- dja %>%
mutate(Date = parse_date_time(Date,orders = "mdy"))
ggplotly(ggplot(dja,aes(Date, DJIA))+
geom_line()) %>%
layout(legend = list(
orientation = "h"))
summary(dja)
Date DJIA
Min. :1885-05-02 00:00:00 Min. : 24.36
1st Qu.:1916-02-09 06:00:00 1st Qu.: 70.41
Median :1946-10-14 12:00:00 Median : 199.28
Mean :1949-03-11 07:36:39 Mean : 2354.03
3rd Qu.:1982-06-06 06:00:00 3rd Qu.: 1002.07
Max. :2018-09-10 00:00:00 Max. :26616.71
dja %>%
mutate(dif = (DJIA - lag(DJIA, default = DJIA[1]))/lag(DJIA, default = DJIA[1])) %>%
ggplot(.,aes(Date, dif))+
geom_rect(fill="firebrick",
xmin=parse_date_time("01-01-1930",orders = "mdy"),
xmax=parse_date_time("01-01-1940",orders = "mdy"),
ymin=-1,
ymax=1,
alpha=0.5)+
geom_line()

armo una lista de las crisis conocidas
Crisis
url <- "https://www.caproasia.com/2016/04/12/economic-crisis-since-1900-2015/"
crisis <- url %>%
read_html() %>%
html_nodes(css = 'table') %>%
html_table(header = T)
crisis <- crisis[[1]] %>%
filter(Affected %in% c("United States","Global")) %>%
separate(Period,c("desde","hasta")," – ")
Expected 2 pieces. Missing pieces filled with `NA` in 10 rows [1, 4, 5, 6, 7, 8, 9, 10, 11, 12].
#en realidad las que terminan en "s" no duran toda la década. Las agrego a mano.
# mutate(hasta = parse_date_time(case_when(grepl("s",desde)~as.numeric(str_extract(desde,"[[:digit:]]*"))+10,
# TRUE~ as.numeric(hasta)),"y"),
# desde = parse_date_time(str_extract(desde,"[[:digit:]]*"),"y"))
crisis <- crisis %>%
mutate(hasta = parse_date_time(case_when(desde=="1970s"~"1979",
desde=="1980s"~"1982",
desde == "1990s"~"1991",
TRUE~hasta),"y"),
desde = parse_date_time(case_when(desde=="1970s"~"1973",
desde=="1980s"~"1981",
desde=="1990s"~"1990",
TRUE~desde),"y"))
# tabla <- crisis %>%
# filter(Affected %in% c("United States","Global")) %>%
# select(-Region, - Affected) %>%
# xtable(.)
#En la consola
# print(tabla, include.rownames = F)
crisis_largas <- na.omit(crisis)
crisis_puntuales <- crisis %>%
filter(is.na(hasta))
dja <- dja %>%
mutate(dif = (DJIA - lag(DJIA, default = DJIA[1]))/lag(DJIA, default = DJIA[1]))
ggplot()+
geom_rect(data= crisis_largas,
aes(xmin=crisis_largas$desde,
xmax=crisis_largas$hasta),
fill="firebrick",
ymin=-1,
ymax=1,
alpha=0.5)+
geom_line(data = dja,aes(Date, dif))+
geom_vline(data=crisis_puntuales, aes(xintercept=desde), color = "red", linetype="dashed")

NA
NA
Este gráfico me da la sensación de que todo estuviera corrido a la derecha (mirando las crisis puntuales vs los picos)
Gold
gold %>%
ggplot(., aes(Year, `New York Market Price (U.S. dollars per fine ounce)`))+
geom_line(size=1)+
geom_vline(xintercept = 1971, color = "red")+
geom_label_repel(data=data_frame(),aes(x=1971,y=1000,label="Fin del patrón oro"),nudge_x = -5,force=10,size=7)+
theme_minimal()+
labs(y="Dólares por onza de oro", x="Año", title="Precio Oro Mercado de Nueva York",
subtitle = "Precio por onza. 1790-2017")+
theme(text = element_text(size = 20))
ggsave("plots/oro.png", dpi=300, width = 10, height = 7, scale=1)

gold %>%
ggplot(., aes(Year, `New York Market Price (U.S. dollars per fine ounce)`))+
geom_line(size=1)+
geom_vline(xintercept = 1971, color = "red")+
geom_label_repel(data=data_frame(),aes(x=1971,y=1000,label="End of the gold standard"),nudge_x = -5,force=10,size=7)+
theme_minimal()+
labs(y="dollars per fine ounce", x="Year")+
theme(text = element_text(size = 20))
ggsave("plots/oro_en.png", dpi=300, width = 10, height = 7, scale=1)
interest_rate
graf <- interest_rate %>%
gather(type,rate,2:4) %>%
ggplot(., aes(Year,rate,color=type))+
geom_line()+
guides(color=guide_legend(nrow=2,byrow=TRUE))+
theme(legend.position = "bottom")
ggplotly(graf) %>%
layout(legend = list(
orientation = "h"
)
)
- La tasa de largo plazo es una serie mucho más suave (eso es un dato conocido de finanzas no?)
- Los surplus funds también parecen ser más volátiles hasta los 40
sap
sap %>%
summary()
sap %>%
gather(type, value,2:4) %>%
mutate(type= case_when(type=="The S&P Index Average for January"~"The S&P Index\nAverage for January",
type=="The Accumulated S&P Index Average for January"~"The Accumulated S&P\nIndex Average for January",
TRUE~type)) %>%
ggplot(.,aes(Year,value, color=type))+
geom_line()+
facet_grid(type~.,scale="free")+
theme(legend.position = "bottom",
strip.text.y = element_text(angle = 0))
ts(sap$`Annual Yield`, start=min(sap$Year), frequency = 1) %>%
na.omit() %>%
auto.arima(.)
CPI
cpi %>%
ggplot(., aes(Year, `U.S. Consumer Price Index *`))+
geom_line(size=1)+
geom_vline(xintercept = 1971, color = "red")+
geom_label_repel(data=data_frame(),aes(x=1971,y=100,label="Fin del patrón oro"),nudge_x = -5,force=10,size=7)+
theme_minimal()+
labs(y="IPC", x="Año")+
theme(text = element_text(size = 20))
ggsave("plots/cpi_orig.png", scale = 1)
gdp

me interesa ver el PBI normalizado por el crecimiento poblacional, y además normalizado por la cantidad de oro que puede comprar (en lugar de normalizar por el CPI):
gdp <- left_join(gold, gdp, by = "Year") %>%
mutate(gdp_in_gold = `Nominal GDP per capita (current dollars)`/`New York Market Price (U.S. dollars per fine ounce)`,
Year = parse_date_time(Year,"y"))
ggplotly(ggplot(gdp,aes(Year,gdp_in_gold))+
geom_line())
A partir del 1900 pareciera que se arman 3 ciclos muy largos
- 1914-1933
- 1933-1980
- 1980-2012
Agregando referencias históricas de las crisis conocidas # gdp_in_gold_eda.PNG
ggplot()+
geom_rect(data= crisis_largas,
aes(xmin=crisis_largas$desde,
xmax=crisis_largas$hasta),
fill="firebrick",
ymin=-Inf,
ymax=Inf,
alpha=0.5)+
geom_line(size=1,
data = gdp %>%
filter(Year>parse_date_time(1900,"y"))
,aes(Year, gdp_in_gold))+
geom_vline(data=crisis_puntuales, aes(xintercept=desde), color = "red", linetype="dashed")+
geom_vline(xintercept = parse_date_time(1971,"y"),color = "gold")+ #fin del patron oro
# scale_x_datetime(date_breaks = "15 years",labels = date_format("%Y") )+
scale_x_datetime(breaks = parse_date_time(seq(1900,2017, 15),'y'), labels = date_format("%Y"))+
theme_minimal()+
labs(x="", y="PBI en oro", title="PBI Estados Unidos",
subtitle= "Millones de onzas de oro, 1900-2017")+
theme(text = element_text(size = 20))
Error in FUN(X[[i]], ...) : object 'gdp_in_gold' not found


La guerra de sesesión de EEUU fué entre el 12 de abril de 1861 y el 9 de abril de 1865
A partir de ahà el pbi en oro crece hasta el fin del patron oro.
wage
Podemos deflactar el salario horario por el CPI
ggplotly(
wage %>%
left_join(cpi,by="Year") %>%
na.omit() %>%
mutate(salario_horario_real = `Production Workers Hourly Compensation (nominal dollars)`/`U.S. Consumer Price Index *`) %>%
ggplot(.,aes(Year,salario_horario_real))+
geom_line()
)
wage %>%
summary()
Podemos deflactar el salario horario por el CPI
ggplotly(
wage %>%
left_join(cpi,by="Year") %>%
na.omit() %>%
mutate(salario_horario_real = `Production Workers Hourly Compensation (nominal dollars)`/`U.S. Consumer Price Index *`) %>%
ggplot(.,aes(Year,salario_horario_real))+
geom_line()
)
wg_gold <- wage %>%
filter(Year>=1900) %>%
left_join(gold, gdp, by = "Year") %>%
mutate(wg_in_gold = `Production Workers Hourly Compensation (nominal dollars)`/`New York Market Price (U.S. dollars per fine ounce)`,
Year = parse_date_time(Year,"y")) %>%
na.omit()
ggplot()+
geom_rect(data= crisis_largas,
aes(xmin=crisis_largas$desde,
xmax=crisis_largas$hasta),
fill="firebrick",
ymin=-Inf,
ymax=Inf,
alpha=0.5)+
geom_line(size=1,data = wg_gold, aes(Year, wg_in_gold))+
geom_vline(data=crisis_puntuales, aes(xintercept=desde), color = "red", linetype="dashed")+
geom_vline(xintercept = parse_date_time(1971,"y"),color = "gold")+ #fin del patron oro
scale_x_datetime(breaks = parse_date_time(seq(1900,2017, 15),'y'), labels = date_format("%Y"))+
# scale_x_datetime(date_breaks = "15 years",labels = date_format("%Y") )+
theme_minimal()+
labs(x="", y="Salario en oro", title="Salario horario Estados Unidos",
subtitle="Onzas de oro, 1900-2017")+
theme(text = element_text(size = 20))
ggsave("plots/wg_in_gold_eda.PNG", dpi = 300, width = 10,height = 6)
ggplot()+
geom_rect(data= crisis_largas,
aes(xmin=crisis_largas$desde,
xmax=crisis_largas$hasta),
fill="firebrick",
ymin=-Inf,
ymax=Inf,
alpha=0.5)+
geom_line(size=1,data = wg_gold, aes(Year, wg_in_gold))+
geom_vline(data=crisis_puntuales, aes(xintercept=desde), color = "red", linetype="dashed")+
geom_vline(xintercept = parse_date_time(1971,"y"),color = "gold")+ #fin del patron oro
#scale_x_datetime(date_breaks = "15 years",labels = date_format("%Y") )+
scale_x_datetime(breaks = parse_date_time(seq(1900,2017, 15),'y'), labels = date_format("%Y"))+
theme_minimal()+
labs(x="", y="Wage in gold")+
theme(text = element_text(size = 20))
ggsave("plots/wg_in_gold_eda_en.PNG", dpi = 300, width = 10,height = 6)
Se ven los mismos tres perÃodos. Pero a diferencia del GDP, el perÃodo 1980-2012 tiene un nivel más bajo que el anterior.
¿ Si quisieramos comparar ingrsos con algún revenue tendrÃamos usar S&P o DJA?
UK
oro <- full_join(brit_gold,gold_london)
Joining, by = "Year"
names(oro)
[1] "Year"
[2] "British Official Price (British pounds per fine ounce end of year)"
[3] "London Market Price (British £ [1718-1949] or U.S. $ [1950-2011] per fine ounce)"
#de http://fx.sauder.ubc.ca/data.html
tc <- read_csv("data/ex_rate.csv")
Parsed with column specification:
cols(
`MMM YYYY` = [31mcol_character()[39m,
`GBP/USD` = [32mcol_double()[39m
)
library(lubridate)
tc <- tc %>% mutate(date = parse_date_time(`MMM YYYY`,"my"),
Year = year(date)) %>%
group_by(Year) %>%
summarise(gbp_usd = mean(`GBP/USD`))
#de http://fx.sauder.ubc.ca/etc/USDpages.pdf
tc_1950_1970 <- data_frame(Year=1950:1970, gbp_usd = 0.35714) %>%
mutate(gbp_usd = case_when(Year ==1967 ~ 0.36210,
Year >1967 ~ 0.41667,
TRUE ~ gbp_usd))
`data_frame()` is deprecated, use `tibble()`.
[90mThis warning is displayed once per session.[39m
tc <- bind_rows(tc_1950_1970,tc)
tc
expreso al oro siempre en pounds
tail(oro)
oro$`London Market Price (British £ [1718-1949] or U.S. $ [1950-2011] per fine ounce)`
oro <- oro %>%
filter(Year %in% c(1700:2017)) %>%
mutate(serie_unificada = case_when(Year < 1718 ~ `British Official Price (British pounds per fine ounce end of year)`,
Year >=1718 ~`London Market Price (British £ [1718-1949] or U.S. $ [1950-2011] per fine ounce)`))
## Tengo que pasar todo a libras, desde 1950 al serie esta en dólares
oro <- oro %>%
left_join(tc) %>%
mutate(serie_unificada = case_when(Year>1950 ~ serie_unificada*gbp_usd,
TRUE ~ serie_unificada))
Gráfico Oro
oro %>%
filter(Year<=1900) %>%
ggplot(., aes(Year,serie_unificada))+
geom_line(size=1)+
scale_y_continuous(limits = c(2,6))+
theme_minimal()+
labs(y="British pounds per fine ounce", x="Year")+
theme(text = element_text(size = 20))
ggsave("plots/oro_uk.png", dpi=300, width = 10, height = 7, scale=1)

PBI uk en oro
gdp_uk <- gdp_uk %>%
left_join(oro) %>%
mutate(gdp_in_gold = `Nominal GDP (million of pounds)`/serie_unificada)
Joining, by = "Year"
crisis <- gdp_uk %>%
filter(Year %in% c(1700:1900)) %>%
mutate(crisis =gdp_in_gold) %>%
filter(Year %in% c(1794,1803, 1812, 1822,1833,1842,1850, 1858, 1868,1879, 1885, 1893))
gdp_uk %>%
filter(Year %in% c(1700:1900)) %>%
ggplot(., aes(Year, gdp_in_gold))+
geom_line(size=1)+
geom_text_repel(data = crisis, aes(Year, crisis,label=Year),nudge_x = 5, nudge_y = -20,force=12,size=4)+
theme_minimal()+
labs(y="PBI en oro", x="Año", title= "Producto Bruto Interno Reino Unido",
subtitle="Millones de onzas de oro. 1700-1900")+
theme(text = element_text(size = 20))
ggsave("plots/uk_gdp.png",scale = 1)
Saving 7.29 x 4.5 in image

gdp_uk %>%
filter(Year %in% c(1700:1900)) %>%
ggplot(., aes(Year, gdp_in_gold))+
geom_line(size=1)+
geom_text_repel(data = crisis, aes(Year, crisis,label=Year),nudge_x = 5, nudge_y = -20,force=12,size=4)+
theme_minimal()+
labs(y="GDP in gold", x="")+
theme(text = element_text(size = 20))
Error in FUN(X[[i]], ...) : object 'gdp_in_gold' not found

gdp_uk %>%
write_csv("data/gdp_uk_gold.csv")
complemento UK
ggplot()+
geom_rect(data= crisis_largas,
aes(xmin=crisis_largas$desde,
xmax=crisis_largas$hasta),
fill="firebrick",
ymin=-Inf,
ymax=Inf,
alpha=0.5)+
geom_line(size=1,
data = gdp_uk %>%
mutate(Year=parse_date_time(Year,"y")) %>%
filter(Year>parse_date_time(1900,"y"))
,aes(Year, gdp_in_gold))+
geom_vline(data=crisis_puntuales, aes(xintercept=desde), color = "red", linetype="dashed")+
geom_vline(xintercept = parse_date_time(1971,"y"),color = "gold")+
scale_x_datetime(breaks = parse_date_time(seq(1900,2017, 15),'y'), labels = date_format("%Y"))+
# scale_x_datetime(date_breaks = "15 years",labels = date_format("%Y") )+
theme_minimal()+
labs(x="", y="GDP in gold")+
theme(text = element_text(size = 20))
ggsave("plots/gdp_uk_complement.png", dpi=300, width = 10, height = 7, scale=1)

LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgbG9hZAoKYGBge3Igc2V0dXB9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShmb3JlY2FzdCkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KHJ2ZXN0KQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeSh4dGFibGUpCmBgYAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpkamEgPC0gcmVhZF9jc3YoImRhdGEvREpBLmNzdiIsc2tpcCA9IDQpCmdvbGQgPC0gcmVhZF9jc3YoImRhdGEvR09MRF8xNzkxLTIwMTguY3N2Iixza2lwID0gMikKaW50ZXJlc3RfcmF0ZSA8LSByZWFkX2NzdigiZGF0YS9JTlRFUkVTVFJBVEVfMTg1Ny0yMDE4LmNzdiIsc2tpcCA9IDEpCnNhcCA8LSByZWFkX2NzdigiZGF0YS9TQVBfMTg3MS0yMDE4LmNzdiIsIHNraXA9MSkKY3BpIDwtIHJlYWRfY3N2KCJkYXRhL1VTQ1BJXzE3NzQtMjAxOC5jc3YiLCBza2lwPTMpCmdkcCA8LSByZWFkX2NzdigiZGF0YS9VU0dEUF8xNzkwLTIwMTguY3N2Iiwgc2tpcD0yKQp3YWdlIDwtIHJlYWRfY3N2KCJkYXRhL1VTV0FHRV8xNzc0LTIwMTguY3N2IikKZ2RwX3VrIDwtICByZWFkX2NzdigiZGF0YS9VS0dEUF8xNzAwLTIwMTcuY3N2Iiwgc2tpcD0xKQoKYnJpdF9nb2xkIDwtIHJlYWRfY3N2KCJkYXRhL0dPTERfYnJpdF8xMjU3LTE5NDUuY3N2Iiwgc2tpcD0xKQpnb2xkX2xvbmRvbiA8LSByZWFkX2NzdigiZGF0YS9HT0xEX2xvbmRvbl8xNzE4LTIwMTcuY3N2Iiwgc2tpcCA9IDEpCmBgYAoKCiMjIERvd24gSm9uZXMgQXZnCmVsIGRqYSBlcyB1bmEgc2VyaWUgZGlhcmlhLCB0b2RhcyBsYXMgZGVtw6FzIHNvbiBhbnVhbGVzLgoKYGBge3J9CmRqYSA8LSBkamEgJT4lIAogIG11dGF0ZShEYXRlID0gcGFyc2VfZGF0ZV90aW1lKERhdGUsb3JkZXJzID0gIm1keSIpKQoKZ2dwbG90bHkoZ2dwbG90KGRqYSxhZXMoRGF0ZSwgREpJQSkpKwogIGdlb21fbGluZSgpKSAlPiUgCiAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoCiAgICAgIG9yaWVudGF0aW9uID0gImgiKSkKCnN1bW1hcnkoZGphKQpgYGAKCgpgYGB7cn0KCmRqYSAlPiUgCiAgbXV0YXRlKGRpZiA9IChESklBIC0gbGFnKERKSUEsIGRlZmF1bHQgPSBESklBWzFdKSkvbGFnKERKSUEsIGRlZmF1bHQgPSBESklBWzFdKSkgJT4lIApnZ3Bsb3QoLixhZXMoRGF0ZSwgZGlmKSkrCiAgZ2VvbV9yZWN0KGZpbGw9ImZpcmVicmljayIsIAogICAgICAgICAgICB4bWluPXBhcnNlX2RhdGVfdGltZSgiMDEtMDEtMTkzMCIsb3JkZXJzID0gIm1keSIpLAogICAgICAgICAgICB4bWF4PXBhcnNlX2RhdGVfdGltZSgiMDEtMDEtMTk0MCIsb3JkZXJzID0gIm1keSIpLAogICAgICAgICAgICB5bWluPS0xLAogICAgICAgICAgICB5bWF4PTEsCiAgICAgICAgICAgIGFscGhhPTAuNSkrCiAgICBnZW9tX2xpbmUoKQoKYGBgCgphcm1vIHVuYSBsaXN0YSBkZSBsYXMgY3Jpc2lzIGNvbm9jaWRhcwoKIyBDcmlzaXMKCmBgYHtyfQp1cmwgPC0gImh0dHBzOi8vd3d3LmNhcHJvYXNpYS5jb20vMjAxNi8wNC8xMi9lY29ub21pYy1jcmlzaXMtc2luY2UtMTkwMC0yMDE1LyIKY3Jpc2lzIDwtIHVybCAlPiUKICByZWFkX2h0bWwoKSAlPiUgCiAgaHRtbF9ub2Rlcyhjc3MgPSAndGFibGUnKSAlPiUgCiAgaHRtbF90YWJsZShoZWFkZXIgPSBUKQoKY3Jpc2lzIDwtIGNyaXNpc1tbMV1dICU+JSAKICBmaWx0ZXIoQWZmZWN0ZWQgJWluJSBjKCJVbml0ZWQgU3RhdGVzIiwiR2xvYmFsIikpICU+JSAKICBzZXBhcmF0ZShQZXJpb2QsYygiZGVzZGUiLCJoYXN0YSIpLCIg4oCTICIpCgoKI2VuIHJlYWxpZGFkIGxhcyBxdWUgdGVybWluYW4gZW4gInMiIG5vIGR1cmFuIHRvZGEgbGEgZMOpY2FkYS4gTGFzIGFncmVnbyBhIG1hbm8uCiAgIyBtdXRhdGUoaGFzdGEgPSBwYXJzZV9kYXRlX3RpbWUoY2FzZV93aGVuKGdyZXBsKCJzIixkZXNkZSl+YXMubnVtZXJpYyhzdHJfZXh0cmFjdChkZXNkZSwiW1s6ZGlnaXQ6XV0qIikpKzEwLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUV+IGFzLm51bWVyaWMoaGFzdGEpKSwieSIpLAogICMgICAgICAgIGRlc2RlID0gcGFyc2VfZGF0ZV90aW1lKHN0cl9leHRyYWN0KGRlc2RlLCJbWzpkaWdpdDpdXSoiKSwieSIpKQoKY3Jpc2lzIDwtIGNyaXNpcyAlPiUgCiAgbXV0YXRlKGhhc3RhID0gcGFyc2VfZGF0ZV90aW1lKGNhc2Vfd2hlbihkZXNkZT09IjE5NzBzIn4iMTk3OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2RlPT0iMTk4MHMifiIxOTgyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzZGUgPT0gIjE5OTBzIn4iMTk5MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUV+aGFzdGEpLCJ5IiksCiAgICAgICAgIGRlc2RlID0gcGFyc2VfZGF0ZV90aW1lKGNhc2Vfd2hlbihkZXNkZT09IjE5NzBzIn4iMTk3MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2RlPT0iMTk4MHMifiIxOTgxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzZGU9PSIxOTkwcyJ+IjE5OTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFfmRlc2RlKSwieSIpKQoKCmBgYAoKCmBgYHtyfQojIHRhYmxhIDwtIGNyaXNpcyAlPiUKIyAgIGZpbHRlcihBZmZlY3RlZCAlaW4lIGMoIlVuaXRlZCBTdGF0ZXMiLCJHbG9iYWwiKSkgJT4lCiMgICBzZWxlY3QoLVJlZ2lvbiwgLSBBZmZlY3RlZCkgJT4lCiMgICB4dGFibGUoLikKCiNFbiBsYSBjb25zb2xhCiMgcHJpbnQodGFibGEsIGluY2x1ZGUucm93bmFtZXMgPSBGKQoKYGBgCgoKYGBge3J9CmNyaXNpc19sYXJnYXMgPC0gbmEub21pdChjcmlzaXMpCmNyaXNpc19wdW50dWFsZXMgPC0gY3Jpc2lzICU+JSAKICBmaWx0ZXIoaXMubmEoaGFzdGEpKQoKCmRqYSA8LSBkamEgJT4lIAogIG11dGF0ZShkaWYgPSAoREpJQSAtIGxhZyhESklBLCBkZWZhdWx0ID0gREpJQVsxXSkpL2xhZyhESklBLCBkZWZhdWx0ID0gREpJQVsxXSkpIApnZ3Bsb3QoKSsKICBnZW9tX3JlY3QoZGF0YT0gY3Jpc2lzX2xhcmdhcywgCiAgICAgICAgICAgIGFlcyh4bWluPWNyaXNpc19sYXJnYXMkZGVzZGUsCiAgICAgICAgICAgIHhtYXg9Y3Jpc2lzX2xhcmdhcyRoYXN0YSksCiAgICAgICAgICAgIGZpbGw9ImZpcmVicmljayIsIAogICAgICAgICAgICB5bWluPS0xLAogICAgICAgICAgICB5bWF4PTEsCiAgICAgICAgICAgIGFscGhhPTAuNSkrCiAgICBnZW9tX2xpbmUoZGF0YSA9IGRqYSxhZXMoRGF0ZSwgZGlmKSkrCiAgZ2VvbV92bGluZShkYXRhPWNyaXNpc19wdW50dWFsZXMsIGFlcyh4aW50ZXJjZXB0PWRlc2RlKSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGU9ImRhc2hlZCIpCiAgCgpgYGAKCgpFc3RlIGdyw6FmaWNvIG1lIGRhIGxhIHNlbnNhY2nDs24gZGUgcXVlIHRvZG8gZXN0dXZpZXJhIGNvcnJpZG8gYSBsYSBkZXJlY2hhIChtaXJhbmRvIGxhcyBjcmlzaXMgcHVudHVhbGVzIHZzIGxvcyBwaWNvcykKCiMgR29sZAoKYGBge3J9CmdvbGQgJT4lIAogIGdncGxvdCguLCBhZXMoWWVhciwgYE5ldyBZb3JrIE1hcmtldCBQcmljZSAoVS5TLiBkb2xsYXJzIHBlciBmaW5lIG91bmNlKWApKSsKICBnZW9tX2xpbmUoc2l6ZT0xKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTcxLCBjb2xvciA9ICJyZWQiKSsKICBnZW9tX2xhYmVsX3JlcGVsKGRhdGE9ZGF0YV9mcmFtZSgpLGFlcyh4PTE5NzEseT0xMDAwLGxhYmVsPSJGaW4gZGVsIHBhdHLDs24gb3JvIiksbnVkZ2VfeCA9IC01LGZvcmNlPTEwLHNpemU9NykrCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnMoeT0iRMOzbGFyZXMgcG9yIG9uemEgZGUgb3JvIiwgeD0iQcOxbyIsIHRpdGxlPSJQcmVjaW8gT3JvIE1lcmNhZG8gZGUgTnVldmEgWW9yayIsCiAgICAgICBzdWJ0aXRsZSA9ICJQcmVjaW8gcG9yIG9uemEuIDE3OTAtMjAxNyIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKCgpnZ3NhdmUoInBsb3RzL29yby5wbmciLCBkcGk9MzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBzY2FsZT0xKQpgYGAKCmBgYHtyfQpnb2xkICU+JSAKICBnZ3Bsb3QoLiwgYWVzKFllYXIsIGBOZXcgWW9yayBNYXJrZXQgUHJpY2UgKFUuUy4gZG9sbGFycyBwZXIgZmluZSBvdW5jZSlgKSkrCiAgZ2VvbV9saW5lKHNpemU9MSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTk3MSwgY29sb3IgPSAicmVkIikrCiAgZ2VvbV9sYWJlbF9yZXBlbChkYXRhPWRhdGFfZnJhbWUoKSxhZXMoeD0xOTcxLHk9MTAwMCxsYWJlbD0iRW5kIG9mIHRoZSBnb2xkIHN0YW5kYXJkIiksbnVkZ2VfeCA9IC01LGZvcmNlPTEwLHNpemU9NykrCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnMoeT0iZG9sbGFycyBwZXIgZmluZSBvdW5jZSIsIHg9IlllYXIiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpCgpnZ3NhdmUoInBsb3RzL29yb19lbi5wbmciLCBkcGk9MzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBzY2FsZT0xKQoKYGBgCgoKCiMjIGludGVyZXN0X3JhdGUKCgpgYGB7cn0KZ3JhZiA8LSBpbnRlcmVzdF9yYXRlICU+JSAKICBnYXRoZXIodHlwZSxyYXRlLDI6NCkgJT4lIAogIGdncGxvdCguLCBhZXMoWWVhcixyYXRlLGNvbG9yPXR5cGUpKSsKICBnZW9tX2xpbmUoKSsKICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG5yb3c9MixieXJvdz1UUlVFKSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCmdncGxvdGx5KGdyYWYpICU+JQogIGxheW91dChsZWdlbmQgPSBsaXN0KAogICAgICBvcmllbnRhdGlvbiA9ICJoIgogICAgKQogICkKYGBgCgotIExhIHRhc2EgZGUgbGFyZ28gcGxhem8gZXMgdW5hIHNlcmllIG11Y2hvIG3DoXMgc3VhdmUgKGVzbyBlcyB1biBkYXRvIGNvbm9jaWRvIGRlIGZpbmFuemFzIG5vPykKLSBMb3Mgc3VycGx1cyBmdW5kcyB0YW1iacOpbiBwYXJlY2VuIHNlciBtw6FzIHZvbMOhdGlsZXMgaGFzdGEgbG9zIDQwCgoKIyMgc2FwCgoKYGBge3J9CnNhcCAlPiUgCiAgc3VtbWFyeSgpCnNhcCAlPiUgCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLDI6NCkgJT4lCiAgbXV0YXRlKHR5cGU9IGNhc2Vfd2hlbih0eXBlPT0iVGhlIFMmUCBJbmRleCBBdmVyYWdlIGZvciBKYW51YXJ5In4iVGhlIFMmUCBJbmRleFxuQXZlcmFnZSBmb3IgSmFudWFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPT0iVGhlIEFjY3VtdWxhdGVkIFMmUCBJbmRleCBBdmVyYWdlIGZvciBKYW51YXJ5In4iVGhlIEFjY3VtdWxhdGVkIFMmUFxuSW5kZXggQXZlcmFnZSBmb3IgSmFudWFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFfnR5cGUpKSAlPiUgCiAgZ2dwbG90KC4sYWVzKFllYXIsdmFsdWUsIGNvbG9yPXR5cGUpKSsKICBnZW9tX2xpbmUoKSsKICBmYWNldF9ncmlkKHR5cGV+LixzY2FsZT0iZnJlZSIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDApKQoKYGBgCgoKCmBgYHtyfQp0cyhzYXAkYEFubnVhbCBZaWVsZGAsIHN0YXJ0PW1pbihzYXAkWWVhciksIGZyZXF1ZW5jeSA9IDEpICU+JSAKICBuYS5vbWl0KCkgJT4lCiAgYXV0by5hcmltYSguKQoKYGBgCgojIyBDUEkKCmBgYHtyfQoKY3BpICU+JSAKICBnZ3Bsb3QoLiwgYWVzKFllYXIsIGBVLlMuIENvbnN1bWVyIFByaWNlIEluZGV4ICpgKSkrCiAgZ2VvbV9saW5lKHNpemU9MSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTk3MSwgY29sb3IgPSAicmVkIikrCiAgZ2VvbV9sYWJlbF9yZXBlbChkYXRhPWRhdGFfZnJhbWUoKSxhZXMoeD0xOTcxLHk9MTAwLGxhYmVsPSJGaW4gZGVsIHBhdHLDs24gb3JvIiksbnVkZ2VfeCA9IC01LGZvcmNlPTEwLHNpemU9NykrCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnMoeT0iSVBDIiwgeD0iQcOxbyIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKCmdnc2F2ZSgicGxvdHMvY3BpX29yaWcucG5nIiwgc2NhbGUgPSAxKQpgYGAKCiMjIGdkcApgYGB7cn0KZ2RwICU+JSAKICBnZ3Bsb3QoLiwgYWVzKFllYXIsIGBSZWFsIEdEUCAobWlsbGlvbnMgb2YgMjAxMiBkb2xsYXJzKWApKSsKICBnZW9tX2xpbmUoc2l6ZT0xKSsKICAjIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE5NzEsIGNvbG9yID0gInJlZCIpKwogICMgZ2VvbV9sYWJlbF9yZXBlbChkYXRhPWRhdGFfZnJhbWUoKSxhZXMoeD0xOTcxLHk9MTAwLGxhYmVsPSJGaW4gZGVsIHBhdHLDs24gb3JvIiksbnVkZ2VfeCA9IC01LGZvcmNlPTEwLHNpemU9NykrCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnMoeT0iUmVhbCBHRFAiLCB4PSJBw7FvIikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApKQoKZ2dzYXZlKCJwbG90cy9QQkkucG5nIiwgc2NhbGUgPSAxKQoKYGBgCgoKCm1lIGludGVyZXNhIHZlciBlbCBQQkkgbm9ybWFsaXphZG8gcG9yIGVsIGNyZWNpbWllbnRvIHBvYmxhY2lvbmFsLCB5IGFkZW3DoXMgbm9ybWFsaXphZG8gcG9yIGxhIGNhbnRpZGFkIGRlIG9ybyBxdWUgcHVlZGUgY29tcHJhciAoZW4gbHVnYXIgZGUgbm9ybWFsaXphciBwb3IgZWwgQ1BJKToKCmBgYHtyfQoKCmdkcCA8LSBsZWZ0X2pvaW4oZ29sZCwgZ2RwLCBieSA9ICJZZWFyIikgJT4lIAogIG11dGF0ZShnZHBfaW5fZ29sZCA9IGBOb21pbmFsIEdEUCBwZXIgY2FwaXRhIChjdXJyZW50IGRvbGxhcnMpYC9gTmV3IFlvcmsgTWFya2V0IFByaWNlIChVLlMuIGRvbGxhcnMgcGVyIGZpbmUgb3VuY2UpYCwKICAgICAgICAgWWVhciA9IHBhcnNlX2RhdGVfdGltZShZZWFyLCJ5IikpIAogIApnZ3Bsb3RseShnZ3Bsb3QoZ2RwLGFlcyhZZWFyLGdkcF9pbl9nb2xkKSkrCiAgZ2VvbV9saW5lKCkpCmBgYAoKQSBwYXJ0aXIgZGVsIDE5MDAgcGFyZWNpZXJhIHF1ZSBzZSBhcm1hbiAzIGNpY2xvcyBtdXkgbGFyZ29zCgotIDE5MTQtMTkzMwotIDE5MzMtMTk4MAotIDE5ODAtMjAxMgoKCkFncmVnYW5kbyByZWZlcmVuY2lhcyBoaXN0w7NyaWNhcyBkZSBsYXMgY3Jpc2lzIGNvbm9jaWRhcwojIGdkcF9pbl9nb2xkX2VkYS5QTkcKCgpgYGB7cn0KbGlicmFyeShzY2FsZXMpICMgdG8gYWNjZXNzIGJyZWFrcy9mb3JtYXR0aW5nIGZ1bmN0aW9ucwpnZ3Bsb3QoKSsKZ2VvbV9yZWN0KGRhdGE9IGNyaXNpc19sYXJnYXMsIAogICAgICAgICAgICBhZXMoeG1pbj1jcmlzaXNfbGFyZ2FzJGRlc2RlLAogICAgICAgICAgICB4bWF4PWNyaXNpc19sYXJnYXMkaGFzdGEpLAogICAgICAgICAgICBmaWxsPSJmaXJlYnJpY2siLCAKICAgICAgICAgICAgeW1pbj0tSW5mLAogICAgICAgICAgICB5bWF4PUluZiwKICAgICAgICAgICAgYWxwaGE9MC41KSsKICBnZW9tX2xpbmUoc2l6ZT0xLAogICAgZGF0YSA9IGdkcCAlPiUgCiAgICAgICAgICAgICAgZmlsdGVyKFllYXI+cGFyc2VfZGF0ZV90aW1lKDE5MDAsInkiKSkKICAgICAgICAgICAgLGFlcyhZZWFyLCBnZHBfaW5fZ29sZCkpKwogIGdlb21fdmxpbmUoZGF0YT1jcmlzaXNfcHVudHVhbGVzLCBhZXMoeGludGVyY2VwdD1kZXNkZSksIGNvbG9yID0gInJlZCIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBwYXJzZV9kYXRlX3RpbWUoMTk3MSwieSIpLGNvbG9yID0gImdvbGQiKSsgI2ZpbiBkZWwgcGF0cm9uIG9ybwogICMgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIxNSB5ZWFycyIsbGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVZIikgKSsKICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IHBhcnNlX2RhdGVfdGltZShzZXEoMTkwMCwyMDE3LCAxNSksJ3knKSwgbGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVZIikpKwogIHRoZW1lX21pbmltYWwoKSsKICBsYWJzKHg9IiIsIHk9IlBCSSBlbiBvcm8iLCB0aXRsZT0iUEJJIEVzdGFkb3MgVW5pZG9zIiwKICAgICAgIHN1YnRpdGxlPSAiTWlsbG9uZXMgZGUgb256YXMgZGUgb3JvLCAxOTAwLTIwMTciKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpCgpnZ3NhdmUoInBsb3RzL2dkcF9pbl9nb2xkX2VkYS5QTkciLCBkcGkgPSAzMDAsIHdpZHRoID0gMTAsaGVpZ2h0ID0gNikKYGBgCgoKYGBge3J9CmdncGxvdCgpKwpnZW9tX3JlY3QoZGF0YT0gY3Jpc2lzX2xhcmdhcywgCiAgICAgICAgICAgIGFlcyh4bWluPWNyaXNpc19sYXJnYXMkZGVzZGUsCiAgICAgICAgICAgIHhtYXg9Y3Jpc2lzX2xhcmdhcyRoYXN0YSksCiAgICAgICAgICAgIGZpbGw9ImZpcmVicmljayIsIAogICAgICAgICAgICB5bWluPS1JbmYsCiAgICAgICAgICAgIHltYXg9SW5mLAogICAgICAgICAgICBhbHBoYT0wLjUpKwogIGdlb21fbGluZShzaXplPTEsCiAgICBkYXRhID0gZ2RwICU+JSAKICAgICAgICAgICAgICBmaWx0ZXIoWWVhcj5wYXJzZV9kYXRlX3RpbWUoMTkwMCwieSIpKQogICAgICAgICAgICAsYWVzKFllYXIsIGdkcF9pbl9nb2xkKSkrCiAgZ2VvbV92bGluZShkYXRhPWNyaXNpc19wdW50dWFsZXMsIGFlcyh4aW50ZXJjZXB0PWRlc2RlKSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHBhcnNlX2RhdGVfdGltZSgxOTcxLCJ5IiksY29sb3IgPSAiZ29sZCIpKyAKICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IHBhcnNlX2RhdGVfdGltZShzZXEoMTkwMCwyMDE3LCAxNSksJ3knKSwgbGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVZIikpKwogICMgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIxNSB5ZWFycyIsbGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVZIikgKSsgIAogIHRoZW1lX21pbmltYWwoKSsKICBsYWJzKHg9IiIsIHk9IkdEUCBpbiBnb2xkIikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApKQoKZ2dzYXZlKCJwbG90cy9nZHBfaW5fZ29sZF9lZGFfZW4uUE5HIiwgZHBpID0gMzAwLCB3aWR0aCA9IDEwLGhlaWdodCA9IDYpCmBgYAoKCkxhIGd1ZXJyYSBkZSBzZXNlc2nDs24gZGUgRUVVVSBmdcOpIGVudHJlIGVsIDEyIGRlIGFicmlsIGRlIDE4NjEgeSBlbCA5IGRlIGFicmlsIGRlIDE4NjUgCgpBIHBhcnRpciBkZSBhaMOtIGVsIHBiaSBlbiBvcm8gY3JlY2UgaGFzdGEgZWwgZmluIGRlbCBwYXRyb24gb3JvLgoKCiMjIEdEUCBjb21wbGVtZW50YXJpbwoKYGBge3J9CgoKCmNyaXNpcyA8LSBnZHAgJT4lIAogIGZpbHRlcihZZWFyPHBhcnNlX2RhdGVfdGltZSgxOTAwLCJ5IikpICU+JSAKICBtdXRhdGUoY3Jpc2lzID1nZHBfaW5fZ29sZCwKICAgICAgICAgeWVhcl9kYmwgPSB5ZWFyKFllYXIpKSAlPiUKICBzZWxlY3QoeWVhcl9kYmwsIFllYXIsIGNyaXNpcykgJT4lIAogIGZpbHRlcih5ZWFyX2RibCAlaW4lIGMoMTgwMiwxODI0LDE4NDMsMTg2NCwgMTg2OSwxODc1LCAxODg1LCAxODk0KSkKCgpnZHAgJT4lIAogIGZpbHRlcihZZWFyPHBhcnNlX2RhdGVfdGltZSgxOTAwLCJ5IikpICU+JSAKZ2dwbG90KC4sIGFlcyhZZWFyLCBnZHBfaW5fZ29sZCkpKwogIGdlb21fbGluZShzaXplPTEpKwogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gY3Jpc2lzLCBhZXMoWWVhciwgY3Jpc2lzLGxhYmVsPXllYXJfZGJsKSxudWRnZV94ID0gNSwgbnVkZ2VfeSA9IC0xLGZvcmNlPTUsc2l6ZT00KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh5PSJHRFAgaW4gZ29sZCIsIHg9IlllYXIiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpCgoKZ2dzYXZlKCJwbG90cy9nZHBfdXNfY29tcGxlbWVudC5wbmciLCBkcGk9MzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBzY2FsZT0xKQoKYGBgCgoKCiMjIHdhZ2UKCmBgYHtyfQp3YWdlICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpQb2RlbW9zIGRlZmxhY3RhciBlbCBzYWxhcmlvIGhvcmFyaW8gcG9yIGVsIENQSQoKYGBge3J9CmdncGxvdGx5KAp3YWdlICU+JSAKICBsZWZ0X2pvaW4oY3BpLGJ5PSJZZWFyIikgJT4lIAogIG5hLm9taXQoKSAlPiUgCiAgbXV0YXRlKHNhbGFyaW9faG9yYXJpb19yZWFsID0gYFByb2R1Y3Rpb24gV29ya2VycyBIb3VybHkgQ29tcGVuc2F0aW9uIChub21pbmFsIGRvbGxhcnMpYC9gVS5TLiBDb25zdW1lciBQcmljZSBJbmRleCAqYCkgJT4lIAogIGdncGxvdCguLGFlcyhZZWFyLHNhbGFyaW9faG9yYXJpb19yZWFsKSkrCiAgZ2VvbV9saW5lKCkgCiAgKQpgYGAKCgpgYGB7cn0Kd2FnZSAlPiUgCiAgc3VtbWFyeSgpCmBgYAoKUG9kZW1vcyBkZWZsYWN0YXIgZWwgc2FsYXJpbyBob3JhcmlvIHBvciBlbCBDUEkKCmBgYHtyfQpnZ3Bsb3RseSgKd2FnZSAlPiUgCiAgbGVmdF9qb2luKGNwaSxieT0iWWVhciIpICU+JSAKICBuYS5vbWl0KCkgJT4lIAogIG11dGF0ZShzYWxhcmlvX2hvcmFyaW9fcmVhbCA9IGBQcm9kdWN0aW9uIFdvcmtlcnMgSG91cmx5IENvbXBlbnNhdGlvbiAobm9taW5hbCBkb2xsYXJzKWAvYFUuUy4gQ29uc3VtZXIgUHJpY2UgSW5kZXggKmApICU+JSAKICBnZ3Bsb3QoLixhZXMoWWVhcixzYWxhcmlvX2hvcmFyaW9fcmVhbCkpKwogIGdlb21fbGluZSgpIAogICkKYGBgCgoKYGBge3J9CndnX2dvbGQgPC0gd2FnZSAlPiUgCiAgZmlsdGVyKFllYXI+PTE5MDApICU+JSAKICBsZWZ0X2pvaW4oZ29sZCwgZ2RwLCBieSA9ICJZZWFyIikgJT4lIAogIG11dGF0ZSh3Z19pbl9nb2xkID0gYFByb2R1Y3Rpb24gV29ya2VycyBIb3VybHkgQ29tcGVuc2F0aW9uIChub21pbmFsIGRvbGxhcnMpYC9gTmV3IFlvcmsgTWFya2V0IFByaWNlIChVLlMuIGRvbGxhcnMgcGVyIGZpbmUgb3VuY2UpYCwKICAgICAgICAgWWVhciA9IHBhcnNlX2RhdGVfdGltZShZZWFyLCJ5IikpICU+JSAKICBuYS5vbWl0KCkgIAoKCmdncGxvdCgpKwpnZW9tX3JlY3QoZGF0YT0gY3Jpc2lzX2xhcmdhcywgCiAgICAgICAgICAgIGFlcyh4bWluPWNyaXNpc19sYXJnYXMkZGVzZGUsCiAgICAgICAgICAgIHhtYXg9Y3Jpc2lzX2xhcmdhcyRoYXN0YSksCiAgICAgICAgICAgIGZpbGw9ImZpcmVicmljayIsIAogICAgICAgICAgICB5bWluPS1JbmYsCiAgICAgICAgICAgIHltYXg9SW5mLAogICAgICAgICAgICBhbHBoYT0wLjUpKwogIGdlb21fbGluZShzaXplPTEsZGF0YSA9IHdnX2dvbGQsIGFlcyhZZWFyLCB3Z19pbl9nb2xkKSkrCiAgZ2VvbV92bGluZShkYXRhPWNyaXNpc19wdW50dWFsZXMsIGFlcyh4aW50ZXJjZXB0PWRlc2RlKSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHBhcnNlX2RhdGVfdGltZSgxOTcxLCJ5IiksY29sb3IgPSAiZ29sZCIpKyAjZmluIGRlbCBwYXRyb24gb3JvCiAgc2NhbGVfeF9kYXRldGltZShicmVha3MgPSBwYXJzZV9kYXRlX3RpbWUoc2VxKDE5MDAsMjAxNywgMTUpLCd5JyksIGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWSIpKSsKICAjIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiMTUgeWVhcnMiLGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWSIpICkrCiAgdGhlbWVfbWluaW1hbCgpKyAgCiAgbGFicyh4PSIiLCB5PSJTYWxhcmlvIGVuIG9ybyIsIHRpdGxlPSJTYWxhcmlvIGhvcmFyaW8gRXN0YWRvcyBVbmlkb3MiLAogICAgICAgc3VidGl0bGU9Ik9uemFzIGRlIG9ybywgMTkwMC0yMDE3IikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApKQoKCmdnc2F2ZSgicGxvdHMvd2dfaW5fZ29sZF9lZGEuUE5HIiwgZHBpID0gMzAwLCB3aWR0aCA9IDEwLGhlaWdodCA9IDYpCgpgYGAKCgpgYGB7cn0KZ2dwbG90KCkrCmdlb21fcmVjdChkYXRhPSBjcmlzaXNfbGFyZ2FzLCAKICAgICAgICAgICAgYWVzKHhtaW49Y3Jpc2lzX2xhcmdhcyRkZXNkZSwKICAgICAgICAgICAgeG1heD1jcmlzaXNfbGFyZ2FzJGhhc3RhKSwKICAgICAgICAgICAgZmlsbD0iZmlyZWJyaWNrIiwgCiAgICAgICAgICAgIHltaW49LUluZiwKICAgICAgICAgICAgeW1heD1JbmYsCiAgICAgICAgICAgIGFscGhhPTAuNSkrCiAgZ2VvbV9saW5lKHNpemU9MSxkYXRhID0gd2dfZ29sZCwgYWVzKFllYXIsIHdnX2luX2dvbGQpKSsKICBnZW9tX3ZsaW5lKGRhdGE9Y3Jpc2lzX3B1bnR1YWxlcywgYWVzKHhpbnRlcmNlcHQ9ZGVzZGUpLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gcGFyc2VfZGF0ZV90aW1lKDE5NzEsInkiKSxjb2xvciA9ICJnb2xkIikrICNmaW4gZGVsIHBhdHJvbiBvcm8KICAjc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIxNSB5ZWFycyIsbGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVZIikgKSsKICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IHBhcnNlX2RhdGVfdGltZShzZXEoMTkwMCwyMDE3LCAxNSksJ3knKSwgbGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVZIikpKwogIHRoZW1lX21pbmltYWwoKSsgIAogIGxhYnMoeD0iIiwgeT0iV2FnZSBpbiBnb2xkIikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApKQoKCmdnc2F2ZSgicGxvdHMvd2dfaW5fZ29sZF9lZGFfZW4uUE5HIiwgZHBpID0gMzAwLCB3aWR0aCA9IDEwLGhlaWdodCA9IDYpCgpgYGAKCgpTZSB2ZW4gbG9zIG1pc21vcyB0cmVzIHBlcsOtb2Rvcy4gUGVybyBhIGRpZmVyZW5jaWEgZGVsIEdEUCwgZWwgcGVyw61vZG8gMTk4MC0yMDEyIHRpZW5lIHVuIG5pdmVsIG3DoXMgYmFqbyBxdWUgZWwgYW50ZXJpb3IuIAogCgrCvyBTaSBxdWlzaWVyYW1vcyBjb21wYXJhciBpbmdyc29zIGNvbiBhbGfDum4gcmV2ZW51ZSB0ZW5kcsOtYW1vcyB1c2FyIFMmUCBvIERKQT8KCgojIyMjIENvbXBsZW1lbnRhcmlvCgpgYGB7cn0KCndnX2dvbGRfb2xkIDwtIHdhZ2UgJT4lIAogIGZpbHRlcihZZWFyPD0xOTAwKSAlPiUgCiAgbGVmdF9qb2luKGdvbGQsIGdkcCwgYnkgPSAiWWVhciIpICU+JSAKICBtdXRhdGUod2dfaW5fZ29sZCA9IGBQcm9kdWN0aW9uIFdvcmtlcnMgSG91cmx5IENvbXBlbnNhdGlvbiAobm9taW5hbCBkb2xsYXJzKWAvYE5ldyBZb3JrIE1hcmtldCBQcmljZSAoVS5TLiBkb2xsYXJzIHBlciBmaW5lIG91bmNlKWAsCiAgICAgICAgIFllYXIgPSBwYXJzZV9kYXRlX3RpbWUoWWVhciwieSIpKSAlPiUgCiAgbmEub21pdCgpICAKCmNyaXNpcyA8LSB3Z19nb2xkX29sZCAlPiUgCiAgZmlsdGVyKFllYXI8cGFyc2VfZGF0ZV90aW1lKDE5MDAsInkiKSkgJT4lIAogIG11dGF0ZShjcmlzaXMgPXdnX2luX2dvbGQsCiAgICAgICAgIHllYXJfZGJsID0geWVhcihZZWFyKSkgJT4lCiAgc2VsZWN0KHllYXJfZGJsLCBZZWFyLCBjcmlzaXMpICU+JSAKICBmaWx0ZXIoeWVhcl9kYmwgJWluJSBjKDE4MDIsMTgyNCwxODQzLDE4NjQsIDE4NjksMTg3NSwgMTg4NSwgMTg5NCkpCgpnZ3Bsb3Qod2dfZ29sZF9vbGQsIGFlcyhZZWFyLCB3Z19pbl9nb2xkKSkrCiAgZ2VvbV9saW5lKHNpemU9MSkrCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjcmlzaXMsIGFlcyhZZWFyLCBjcmlzaXMsbGFiZWw9eWVhcl9kYmwpLG51ZGdlX3ggPSA1LCBudWRnZV95ID0gLS4wMDEsZm9yY2U9NSxzaXplPTQpKwogIHRoZW1lX21pbmltYWwoKSsKICBsYWJzKHk9IkdEUCBpbiBnb2xkIiwgeD0iWWVhciIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKCgpnZ3NhdmUoInBsb3RzL3dhZ2VfdXNfY29tcGxlbWVudC5wbmciLCBkcGk9MzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBzY2FsZT0xKQoKCgoKYGBgCgoKCgojIyMjIFVLCgpgYGB7cn0Kb3JvIDwtIGZ1bGxfam9pbihicml0X2dvbGQsZ29sZF9sb25kb24pCgpuYW1lcyhvcm8pCgpgYGAKCgpgYGB7cn0KCiNkZSBodHRwOi8vZnguc2F1ZGVyLnViYy5jYS9kYXRhLmh0bWwKdGMgPC0gcmVhZF9jc3YoImRhdGEvZXhfcmF0ZS5jc3YiKQoKbGlicmFyeShsdWJyaWRhdGUpCgp0YyA8LSB0YyAlPiUgbXV0YXRlKGRhdGUgPSBwYXJzZV9kYXRlX3RpbWUoYE1NTSBZWVlZYCwibXkiKSwKICAgICAgICAgICAgICBZZWFyID0geWVhcihkYXRlKSkgJT4lIAogIGdyb3VwX2J5KFllYXIpICU+JSAKICBzdW1tYXJpc2UoZ2JwX3VzZCA9IG1lYW4oYEdCUC9VU0RgKSkKCgojZGUgaHR0cDovL2Z4LnNhdWRlci51YmMuY2EvZXRjL1VTRHBhZ2VzLnBkZgoKdGNfMTk1MF8xOTcwIDwtIGRhdGFfZnJhbWUoWWVhcj0xOTUwOjE5NzAsIGdicF91c2QgPSAwLjM1NzE0KSAlPiUgCiAgbXV0YXRlKGdicF91c2QgPSBjYXNlX3doZW4oWWVhciA9PTE5NjcgfiAwLjM2MjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPjE5NjcgfiAwLjQxNjY3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBnYnBfdXNkKSkKCnRjIDwtIGJpbmRfcm93cyh0Y18xOTUwXzE5NzAsdGMpCnRjCmBgYAoKCgpleHByZXNvIGFsIG9ybyBzaWVtcHJlIGVuIHBvdW5kcwoKYGBge3J9CnRhaWwob3JvKQoKCm9ybyRgTG9uZG9uIE1hcmtldCBQcmljZSAoQnJpdGlzaCAmcG91bmQ7IFsxNzE4LTE5NDldIG9yIFUuUy4gJCBbMTk1MC0yMDExXSBwZXIgZmluZSBvdW5jZSlgCgpvcm8gPC0gb3JvICU+JSAKICBmaWx0ZXIoWWVhciAlaW4lIGMoMTcwMDoyMDE3KSkgJT4lIAogIG11dGF0ZShzZXJpZV91bmlmaWNhZGEgPSBjYXNlX3doZW4oWWVhciA8IDE3MTggfiBgQnJpdGlzaCBPZmZpY2lhbCBQcmljZSAoQnJpdGlzaCBwb3VuZHMgcGVyIGZpbmUgb3VuY2UgZW5kIG9mIHllYXIpYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPj0xNzE4IH5gTG9uZG9uIE1hcmtldCBQcmljZSAoQnJpdGlzaCAmcG91bmQ7IFsxNzE4LTE5NDldIG9yIFUuUy4gJCBbMTk1MC0yMDExXSBwZXIgZmluZSBvdW5jZSlgKSkKCiMjIFRlbmdvIHF1ZSBwYXNhciB0b2RvIGEgbGlicmFzLCBkZXNkZSAxOTUwIGFsIHNlcmllIGVzdGEgZW4gZMOzbGFyZXMKCm9ybyA8LSBvcm8gJT4lIAogIGxlZnRfam9pbih0YykgJT4lIAogIG11dGF0ZShzZXJpZV91bmlmaWNhZGEgPSBjYXNlX3doZW4oWWVhcj4xOTUwIH4gc2VyaWVfdW5pZmljYWRhKmdicF91c2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gc2VyaWVfdW5pZmljYWRhKSkKICAKYGBgCgpHcsOhZmljbyBPcm8KYGBge3J9CiAgb3JvICU+JSAKICBmaWx0ZXIoWWVhcjw9MTkwMCkgJT4lIAogIGdncGxvdCguLCBhZXMoWWVhcixzZXJpZV91bmlmaWNhZGEpKSsKICBnZW9tX2xpbmUoc2l6ZT0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygyLDYpKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh5PSJCcml0aXNoIHBvdW5kcyBwZXIgZmluZSBvdW5jZSIsIHg9IlllYXIiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpCgoKZ2dzYXZlKCJwbG90cy9vcm9fdWsucG5nIiwgZHBpPTMwMCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNywgc2NhbGU9MSkKYGBgCgoKCgojIyBQQkkgdWsgZW4gb3JvCgoKYGBge3J9CgpnZHBfdWsgPC0gZ2RwX3VrICU+JSAKICBsZWZ0X2pvaW4ob3JvKSAlPiUgCiAgbXV0YXRlKGdkcF9pbl9nb2xkID0gYE5vbWluYWwgR0RQIChtaWxsaW9uIG9mIHBvdW5kcylgL3NlcmllX3VuaWZpY2FkYSkKCgpjcmlzaXMgPC0gZ2RwX3VrICU+JSAKICBmaWx0ZXIoWWVhciAlaW4lIGMoMTcwMDoxOTAwKSkgJT4lIAogIG11dGF0ZShjcmlzaXMgPWdkcF9pbl9nb2xkKSAlPiUgCiAgZmlsdGVyKFllYXIgJWluJSBjKDE3OTQsMTgwMywgMTgxMiwgMTgyMiwxODMzLDE4NDIsMTg1MCwgMTg1OCwgMTg2OCwxODc5LCAxODg1LCAxODkzKSkKCmdkcF91ayAlPiUgCiAgZmlsdGVyKFllYXIgJWluJSBjKDE3MDA6MTkwMCkpICU+JSAKZ2dwbG90KC4sIGFlcyhZZWFyLCBnZHBfaW5fZ29sZCkpKwogIGdlb21fbGluZShzaXplPTEpKwogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gY3Jpc2lzLCBhZXMoWWVhciwgY3Jpc2lzLGxhYmVsPVllYXIpLG51ZGdlX3ggPSA1LCBudWRnZV95ID0gLTIwLGZvcmNlPTEyLHNpemU9NCkrCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnMoeT0iUEJJIGVuIG9ybyIsIHg9IkHDsW8iLCB0aXRsZT0gIlByb2R1Y3RvIEJydXRvIEludGVybm8gUmVpbm8gVW5pZG8iLCAKICAgICAgIHN1YnRpdGxlPSJNaWxsb25lcyBkZSBvbnphcyBkZSBvcm8uIDE3MDAtMTkwMCIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKCgpnZ3NhdmUoInBsb3RzL3VrX2dkcC5wbmciLHNjYWxlID0gMSkKYGBgCgpgYGB7cn0KZ2RwX3VrICU+JSAKICBmaWx0ZXIoWWVhciAlaW4lIGMoMTcwMDoxOTAwKSkgJT4lIApnZ3Bsb3QoLiwgYWVzKFllYXIsIGdkcF9pbl9nb2xkKSkrCiAgZ2VvbV9saW5lKHNpemU9MSkrCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjcmlzaXMsIGFlcyhZZWFyLCBjcmlzaXMsbGFiZWw9WWVhciksbnVkZ2VfeCA9IDUsIG51ZGdlX3kgPSAtMjAsZm9yY2U9MTIsc2l6ZT00KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh5PSJHRFAgaW4gZ29sZCIsIHg9IiIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKZ2dzYXZlKCJwbG90cy91a19nZHBfZW4ucG5nIixzY2FsZSA9IDEpCgoKZ2RwX3VrICU+JSAKICBmaWx0ZXIoWWVhciAlaW4lIGMoMTcwMDoxOTAwKSkgJT4lIApnZ3Bsb3QoLiwgYWVzKFllYXIsIGdkcF9pbl9nb2xkKSkrCiAgZ2VvbV9saW5lKHNpemU9MSkrCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjcmlzaXMsIGFlcyhZZWFyLCBjcmlzaXMsbGFiZWw9WWVhciksbnVkZ2VfeCA9IDUsIG51ZGdlX3kgPSAtMjAsZm9yY2U9MTIsc2l6ZT00KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh5PSJHRFAgaW4gZ29sZCIsIHg9IiIsIHRpdGxlPSAiVUsgR0RQIiwgCiAgICAgICBzdWJ0aXRsZT0iTWlsbGlvbnMgb2Ygb3VuY2VzIG9mIGdvbGQuIDE3MDAtMTkwMCIpKwpgYGAKCgoKCmBgYHtyfQpnZHBfdWsgJT4lIAogIHdyaXRlX2NzdigiZGF0YS9nZHBfdWtfZ29sZC5jc3YiKQpgYGAKCgoKCgojIyMjIyBjb21wbGVtZW50byBVSwoKYGBge3J9CmdncGxvdCgpKwpnZW9tX3JlY3QoZGF0YT0gY3Jpc2lzX2xhcmdhcywgCiAgICAgICAgICAgIGFlcyh4bWluPWNyaXNpc19sYXJnYXMkZGVzZGUsCiAgICAgICAgICAgIHhtYXg9Y3Jpc2lzX2xhcmdhcyRoYXN0YSksCiAgICAgICAgICAgIGZpbGw9ImZpcmVicmljayIsIAogICAgICAgICAgICB5bWluPS1JbmYsCiAgICAgICAgICAgIHltYXg9SW5mLAogICAgICAgICAgICBhbHBoYT0wLjUpKwogIGdlb21fbGluZShzaXplPTEsCiAgICBkYXRhID0gZ2RwX3VrICU+JQogICAgICBtdXRhdGUoWWVhcj1wYXJzZV9kYXRlX3RpbWUoWWVhciwieSIpKSAlPiUgCiAgICAgICAgICAgICAgZmlsdGVyKFllYXI+cGFyc2VfZGF0ZV90aW1lKDE5MDAsInkiKSkKICAgICAgICAgICAgLGFlcyhZZWFyLCBnZHBfaW5fZ29sZCkpKwogIGdlb21fdmxpbmUoZGF0YT1jcmlzaXNfcHVudHVhbGVzLCBhZXMoeGludGVyY2VwdD1kZXNkZSksIGNvbG9yID0gInJlZCIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBwYXJzZV9kYXRlX3RpbWUoMTk3MSwieSIpLGNvbG9yID0gImdvbGQiKSsgCiAgc2NhbGVfeF9kYXRldGltZShicmVha3MgPSBwYXJzZV9kYXRlX3RpbWUoc2VxKDE5MDAsMjAxNywgMTUpLCd5JyksIGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWSIpKSsKICAjIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiMTUgeWVhcnMiLGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWSIpICkrICAKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh4PSIiLCB5PSJHRFAgaW4gZ29sZCIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKCmdnc2F2ZSgicGxvdHMvZ2RwX3VrX2NvbXBsZW1lbnQucG5nIiwgZHBpPTMwMCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNywgc2NhbGU9MSkKCmBgYAoKCiMjIyMjIFBCSSBtdW5kaWFsCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCm1wZF8yMDEzXzAxIDwtIHJlYWRfZXhjZWwoImRhdGEvbXBkXzIwMTMtMDEueGxzeCIsIAogICAgc2hlZXQgPSAiUGVyQ2FwaXRhR0RQVXBkYXRlIiwgc2tpcCA9IDIpCgpnZHBfZ2xvYmFsIDwtIG1wZF8yMDEzXzAxICU+JSAKICBzZWxlY3QoeWVhciA9IC4uLjEsIGdsb2JhbF9nZHAgPSBgVG90YWwgV29ybGRgKSAlPiUgCiAgbmEub21pdCgpICU+JSAKICBtdXRhdGUoWWVhciA9IHBhcnNlX2RhdGVfdGltZSh5ZWFyLCAieSIpKQoKCmdncGxvdCgpKwpnZW9tX3JlY3QoZGF0YT0gY3Jpc2lzX2xhcmdhcywgCiAgICAgICAgICAgIGFlcyh4bWluPWNyaXNpc19sYXJnYXMkZGVzZGUsCiAgICAgICAgICAgIHhtYXg9Y3Jpc2lzX2xhcmdhcyRoYXN0YSksCiAgICAgICAgICAgIGZpbGw9ImZpcmVicmljayIsIAogICAgICAgICAgICB5bWluPS1JbmYsCiAgICAgICAgICAgIHltYXg9SW5mLAogICAgICAgICAgICBhbHBoYT0wLjUpKwogIGdlb21fbGluZShzaXplPTEsCiAgICBkYXRhID0gZ2RwX2dsb2JhbCAsYWVzKFllYXIsIGdsb2JhbF9nZHApKSsKICBnZW9tX3ZsaW5lKGRhdGE9Y3Jpc2lzX3B1bnR1YWxlcywgYWVzKHhpbnRlcmNlcHQ9ZGVzZGUpLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gcGFyc2VfZGF0ZV90aW1lKDE5NzEsInkiKSxjb2xvciA9ICJnb2xkIikrIAogICMgc2NhbGVfeF9kYXRldGltZShicmVha3MgPSBwYXJzZV9kYXRlX3RpbWUoc2VxKDE5MDAsMjAxNywgMTUpLCd5JyksIGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWSIpKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh4PSIiLCB5PSJHRFAgcGVyIGNhcGl0YSIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKCgpnZ3NhdmUoInBsb3RzL2dsb2JhbF9nZHAucG5nIiwgZHBpPTMwMCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNywgc2NhbGU9MSkKCgpgYGAKCgoKCg==